package cn.patient.pp.module.patients.controller.admin.vo;

import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonSetter;
import lombok.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.patient.pp.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Arrays;
import java.util.List;

import static cn.patient.pp.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;

@Schema(description = "管理后台 - 随访列表分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class FollowUpPageReqVO extends PageParam {
    @Schema(description = "管理机构id", example = "22488")
    private List<String> deptIds;
    @Schema(description = "姓名", example = "赵六")
    private String patientName;

    @Schema(description = "性别")
    private String gender;
    @Schema(description = "管理地区")
    private String managementArea;

    @Schema(description = "所属机构", example = "李四")
    private String managementOrgName;

    @Schema(description = "患者编号")
    private String patientCode;

    @Schema(description = "证件类型", example = "1")
    private String idNumberType;

    @Schema(description = "证件号码")
    private String idNumber;

    /**
     * 目前诊断类别
     */
    @Schema(description = "目前诊断类别")
    @ExcelProperty("目前诊断类别")
    private String currentDiagnosisCategory;

    /**
     * 当前管理单位分库状态
     */
    @Schema(description = "当前管理单位分库状态")
    @ExcelProperty("当前管理单位分库状态")
    private String currentOrgSubDbStatus;

    /**
     * 录入日期
     */
    @Schema(description = "录入日期")
    @ExcelProperty("录入日期")
    private String entryDate;

    /**
     * 随访日期
     */
    @Schema(description = "随访日期")
    @ExcelProperty("随访日期")
    private String[] followUpDate;

    /**
     * 本次随访形式
     */
    @Schema(description = "本次随访形式")
    @ExcelProperty("本次随访形式")
    private String followUpMode;

    /**
     * 面访形式
     */
    @Schema(description = "面访形式")
    @ExcelProperty("面访形式")
    private String faceToFaceMode;

    /**
     * 本次随访访视对象
     */
    @Schema(description = "本次随访访视对象")
    @ExcelProperty("本次随访访视对象")
    private String followUpTarget;

    /**
     * 是否死亡
     */
    @Schema(description = "是否死亡")
    @ExcelProperty("是否死亡")
    private String deceased;

    /**
     * 死亡日期
     */
    @Schema(description = "死亡日期")
    @ExcelProperty("死亡日期")
    private String dateOfDeath;

    /**
     * 失访原因
     */
    @Schema(description = "失访原因")
    @ExcelProperty("失访原因")
    private String lostContactReason;

    /**
     * 两次随访期间住院情况
     */
    @Schema(description = "两次随访期间住院情况")
    @ExcelProperty("两次随访期间住院情况")
    private String hospitalizationStatusBetween;

    /**
     * 末次出院时间
     */
    @Schema(description = "末次出院时间")
    @ExcelProperty("末次出院时间")
    private String[] lastDischargeDate;

    /**
     * 危险性评估
     */
    @Schema(description = "危险性评估")
    @ExcelProperty("危险性评估")
    private String riskAssessment;

    /**
     * 目前症状有无
     */
    @Schema(description = "目前症状有无")
    @ExcelProperty("目前症状有无")
    private String currentSymptoms;

    /**
     * 目前症状
     */
    @Schema(description = "目前症状")
    @ExcelProperty("目前症状")
    private String currentSymptomsDetail;

    /**
     * 自知力
     */
    @Schema(description = "自知力")
    @ExcelProperty("自知力")
    private String insight;

    /**
     * 睡眠
     */
    @Schema(description = "睡眠")
    @ExcelProperty("睡眠")
    private String sleepCondition;

    /**
     * 饮食
     */
    @Schema(description = "饮食")
    @ExcelProperty("饮食")
    private String eatingCondition;

    /**
     * 个人生活料理
     */
    @Schema(description = "个人生活料理")
    @ExcelProperty("个人生活料理")
    private String selfCare;

    /**
     * 家务劳动
     */
    @Schema(description = "家务劳动")
    @ExcelProperty("家务劳动")
    private String householdTasks;

    /**
     * 生产劳动及工作
     */
    @Schema(description = "生产劳动及工作")
    @ExcelProperty("生产劳动及工作")
    private String workStatus;

    /**
     * 学习能力
     */
    @Schema(description = "学习能力")
    @ExcelProperty("学习能力")
    private String learningAbility;

    /**
     * 社会人际交往
     */
    @Schema(description = "社会人际交往")
    @ExcelProperty("社会人际交往")
    private String socialInteraction;

    /**
     * 危险行为有无
     */
    @Schema(description = "危险行为有无")
    @ExcelProperty("危险行为有无")
    private String dangerousBehaviorsFlag;

    /**
     * 轻度滋事
     */
    @Schema(description = "轻度滋事")
    @ExcelProperty("轻度滋事")
    private Integer minorNuisanceCount;

    /**
     * 肇事（次）
     */
    @Schema(description = "肇事（次）")
    @ExcelProperty("肇事（次）")
    private Integer incidentCount;

    /**
     * 肇祸（次）
     */
    @Schema(description = "肇祸（次）")
    @ExcelProperty("肇祸（次）")
    private Integer harmfulIncidentCount;

    /**
     * 其他危险行为（次）
     */
    @Schema(description = "其他危险行为（次）")
    @ExcelProperty("其他危险行为（次）")
    private Integer otherDangerousBehaviorCount;

    /**
     * 自伤（次）
     */
    @Schema(description = "自伤（次）")
    @ExcelProperty("自伤（次）")
    private Integer selfInjuryCount;

    /**
     * 自杀未遂（次）
     */
    @Schema(description = "自杀未遂（次）")
    @ExcelProperty("自杀未遂（次）")
    private Integer suicideAttemptCount;

    /**
     * 两次随访期间关锁情况
     */
    @Schema(description = "两次随访期间关锁情况")
    @ExcelProperty("两次随访期间关锁情况")
    private String seclusionStatus;

    /**
     * 服药依从性
     */
    @Schema(description = "服药依从性")
    @ExcelProperty("服药依从性")
    private String medicationAdherence;

    /**
     * （服药依从性）不用药主要原因
     */
    @Schema(description = "(服药依从性)不用药主要原因")
    @ExcelProperty("(服药依从性)不用药主要原因")
    private String reasonNotTakingMedication;

    /**
     * 医生姓名
     */
    @Schema(description = "医生姓名")
    @ExcelProperty("医生姓名")
    private String doctor;

    /**
     * 医院
     */
    @Schema(description = "医院")
    @ExcelProperty("医院")
    private String hospital;

    /**
     * 药物不良反应
     */
    @Schema(description = "药物不良反应")
    @ExcelProperty("药物不良反应")
    private String adverseDrugReactions;

    /**
     * 药物不良反应类型
     */
    @Schema(description = "药物不良反应类型")
    @ExcelProperty("药物不良反应类型")
    private String adverseDrugReactionsType;

    /**
     * 治疗效果
     */
    @Schema(description = "治疗效果")
    @ExcelProperty("治疗效果")
    private String treatmentEffect;

    /**
     * 严重躯体疾病有无
     */
    @Schema(description = "严重躯体疾病有无")
    @ExcelProperty("严重躯体疾病有无")
    private String hasSeverePhysicalDisease;

    /**
     * 严重躯体疾病请注明
     */
    @Schema(description = "严重躯体疾病请注明")
    @ExcelProperty("严重躯体疾病请注明")
    private String severePhysicalDiseaseRemark;

    /**
     * 是否已转诊
     */
    @Schema(description = "是否已转诊")
    @ExcelProperty("是否已转诊")
    private String referralFlag;

    /**
     * 建议转诊原因
     */
    @Schema(description = "建议转诊原因")
    @ExcelProperty("建议转诊原因")
    private String referralReason;

    /**
     * 转诊至机构及科室
     */
    @Schema(description = "转诊至机构及科室")
    @ExcelProperty("转诊至机构及科室")
    private String referralDestination;

    /**
     * 康复措施
     */
    @Schema(description = "康复措施")
    @ExcelProperty("康复措施")
    private String rehabilitationMeasures;

    /**
     * 本次随访分类
     */
    @Schema(description = "本次随访分类")
    @ExcelProperty("本次随访分类")
    private String currentFollowupType;

    /**
     * 是否进行个案管理
     */
    @Schema(description = "是否进行个案管理")
    @ExcelProperty("是否进行个案管理")
    private String caseManagementFlag;

    /**
     * 应急处置
     */
    @Schema(description = "应急处置")
    @ExcelProperty("应急处置")
    private String emergencyHandling;

    /**
     * 下次随访日期
     */
    @Schema(description = "下次随访日期")
    @ExcelProperty("下次随访日期")
    private String[] nextFollowUpDate;

    /**
     * 记录纸
     */
    @Schema(description = "记录纸")
    @ExcelProperty("记录纸")
    private String recordSheet;

    // 输入与输出格式定义
    private static final DateTimeFormatter INPUT_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private static final DateTimeFormatter OUTPUT_FMT = DateTimeFormatter.ofPattern("yyyyMMdd");

    @JsonSetter("entryDate")
    public void setEntryDate(String entryDate) {
        this.entryDate = formatSingle(entryDate);
    }

    @JsonSetter("followUpDate")
    public void setFollowUpDate(String[] followUpDate) {
        this.followUpDate = formatArray(followUpDate);
    }

    @JsonSetter("dateOfDeath")
    public void setDateOfDeath(String dateOfDeath) {
        this.dateOfDeath = formatSingle(dateOfDeath);
    }

    @JsonSetter("lastDischargeDate")
    public void setLastDischargeDate(String[] lastDischargeDate) {
        this.lastDischargeDate = formatArray(lastDischargeDate);
    }

    @JsonSetter("nextFollowUpDate")
    public void setNextFollowUpDate(String[] nextFollowUpDate) {
        this.nextFollowUpDate = formatArray(nextFollowUpDate);
    }

    private String formatSingle(String text) {
        if (text == null || text.trim().isEmpty()) {
            return text;
        }
        try {
            // 第一种格式：yyyy-MM-dd HH:mm:ss
            LocalDateTime dt = LocalDateTime.parse(text, INPUT_FMT);
            return dt.format(OUTPUT_FMT);
        } catch (DateTimeParseException ex) {
            // 第二种格式：ISO-8601 带时区
            Instant inst = Instant.parse(text);
            LocalDateTime dt = LocalDateTime.ofInstant(inst, ZoneId.systemDefault());
            return dt.format(OUTPUT_FMT);
        }
    }

    private String[] formatArray(String[] arr) {
        if (arr == null) {
            return null;
        }
        return Arrays.stream(arr)
                .map(this::formatSingle)
                .toArray(String[]::new);
    }


}